package com.mini.grpc.common;

import java.util.Collections;
import java.util.List;
import java.util.ArrayList;

/**
 * 服务描述符
 * 描述一个gRPC服务的元信息
 * 
 * @author Mini-gRPC
 */
public final class ServiceDescriptor {
    
    private final String name;
    private final List<MethodDescriptor<?, ?>> methods;
    
    /**
     * 私有构造函数
     * 
     * @param name 服务名称
     * @param methods 方法列表
     */
    private ServiceDescriptor(String name, List<MethodDescriptor<?, ?>> methods) {
        this.name = name;
        this.methods = Collections.unmodifiableList(new ArrayList<>(methods));
    }
    
    /**
     * 获取服务名称
     * 
     * @return 服务名称
     */
    public String getName() {
        return name;
    }
    
    /**
     * 获取方法列表
     * 
     * @return 方法列表
     */
    public List<MethodDescriptor<?, ?>> getMethods() {
        return methods;
    }
    
    /**
     * 创建构建器
     * 
     * @param name 服务名称
     * @return 构建器实例
     */
    public static Builder newBuilder(String name) {
        return new Builder(name);
    }
    
    /**
     * 服务描述符构建器
     */
    public static final class Builder {
        private final String name;
        private final List<MethodDescriptor<?, ?>> methods = new ArrayList<>();
        
        private Builder(String name) {
            this.name = name;
        }
        
        /**
         * 添加方法
         * 
         * @param method 方法描述符
         * @return 构建器实例
         */
        public Builder addMethod(MethodDescriptor<?, ?> method) {
            if (method == null) {
                throw new IllegalArgumentException("method cannot be null");
            }
            methods.add(method);
            return this;
        }
        
        /**
         * 构建服务描述符
         * 
         * @return 服务描述符实例
         */
        public ServiceDescriptor build() {
            return new ServiceDescriptor(name, methods);
        }
    }
} 